package com.itheima.work;

/**
 * @auther Macrydy
 * @date 2020/7/9 19:47
 * 请用“等待唤醒”机制编写一个程序，要求：
 *
 * ​       第一个线程：遍历1--1000所有的数字，在遍历过程中，如果发现这个数字能同时被
 *
 * ​       2,3,5,7整除，立即wait()退出等待，让第二个线程进入。
 *
 * ​       第二个线程：运行后，将一个计数器 + 1，之后再唤醒等待的线程。
 *
 * ​       主线程中：休息2秒，让两个线程全部执行完毕，打印“计数器”的结果。
 *
 * ​       **注意：第二个线程使用的计数器，要定义在线程外部。**
 */
public class Test6 {

    public static boolean b = false;
    //定义计数器
    public static int count = 0;

    public static void main(String[] args) throws InterruptedException {
        //锁对象
        Object lock = new Object();

        //线程一
        Thread t1 =  new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <= 1000; i++) {
                    synchronized (lock) {
                        //判断这个数字能否同时被2,3,5,7整除
                        if (i % (2*3*5*7) == 0 ) {
                            b = true;
                            lock.notify();
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        });

        //线程二
        Thread t2 =  new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    synchronized (lock) {
                        if (b == true) {     //判断当前线程该不该执行 , 如果b是true就执行
                            count++;
                            b = false;
                            lock.notify();
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }else{
                            try {
                                //自己进入等待状态
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        });

        //启动程序
        t1.start();
        t2.start();
        //让程序等待2秒后,打印结果
        Thread.sleep(2000);
        //打印数据
        System.out.println("1000以内同时被 2,3,5,7 整除的数量 : "+count);

        //结束程序
        System.exit(0);
    }
}
